/**
 * 地图管理器类
 * 统一管理高德地图及其工具类，简化地图功能的使用
 */
import AMapLoader from "@amap/amap-jsapi-loader";
import DrawingTools from "./DrawingTools";
import MapTools from "./MapTools";

export default class MapManager {
  /**
   * 构造函数
   * @param {Object} options - 配置选项
   */
  constructor(options = {}) {
    this.options = Object.assign(
      {
        // 默认配置
        container: 'map', // 地图容器ID
        key: '', // 高德地图API Key
        securityJsCode: '', // 高德地图安全密钥
        version: '2.0', // API版本
        plugins: [
          'AMap.Scale',
          // 'AMap.ToolBar', // 移除工具条控件，不使用自带的缩放控件
          'AMap.MouseTool',
          'AMap.PolyEditor',
          'AMap.CircleEditor',
          'AMap.GeometryUtil'
        ],
        mapOptions: {
          zoom: 11,
          center: [116.397428, 39.90923],
          mapStyle: 'amap://styles/darkblue',
          viewMode: '3D', // 添加这一行，设置为3D视图模式
          rotateEnable: true,
          pitchEnable: true
        },
        // 是否自动添加比例尺控件
        autoAddScale: true,
        // 绘制工具配置
        drawingOptions: {},
        // 地图工具配置
        mapToolsOptions: {}
      },
      options
    );

    // 初始化属性
    this.map = null;
    this.drawingTools = null;
    this.mapTools = null;
    this.controls = {};
    this.isLoaded = false;
    this.loadPromise = null;
    this.onMapReadyCallbacks = [];
  }

  /**
   * 初始化高德地图
   * @returns {Promise} 返回Promise对象，地图加载完成后解析
   */
  init() {
    if (this.loadPromise) {
      return this.loadPromise;
    }

    this.loadPromise = new Promise((resolve, reject) => {
      // 设置安全密钥
      if (this.options.securityJsCode) {
        window._AMapSecurityConfig = {
          securityJsCode: this.options.securityJsCode,
        };
      }

      // 加载高德地图API
      AMapLoader.load({
        key: this.options.key,
        version: this.options.version,
        plugins: this.options.plugins,
      })
        .then((AMap) => {
          // 创建地图实例
          this.map = new AMap.Map(this.options.container, this.options.mapOptions);

          // 添加比例尺控件
          if (this.options.autoAddScale) {
            const scale = new AMap.Scale();
            this.map.addControl(scale);
            this.controls.scale = scale;
          }
          
          // 不添加工具条控件，移除自带的缩放控件
          // 如果需要其他控件功能，可以通过自定义UI实现
          
          // ControlBar控件已移除

          // 初始化工具类
          this.initTools();

          // 标记地图已加载完成
          this.isLoaded = true;
          console.log('高德地图初始化完成');

          // 执行地图就绪回调函数
          this.onMapReadyCallbacks.forEach(callback => callback(this));

          // 解析Promise
          resolve(this);
        })
        .catch((error) => {
          console.error('高德地图加载失败:', error);
          reject(error);
        });
    });

    return this.loadPromise;
  }

  /**
   * 初始化工具类
   * @private
   */
  initTools() {
    // 创建绘制工具实例
    this.drawingTools = new DrawingTools(this.map, this.options.drawingOptions);

    // 创建地图工具实例
    this.mapTools = new MapTools(this.map, {
      initialZoom: this.options.mapOptions.zoom,
      initialCenter: this.options.mapOptions.center,
      ...this.options.mapToolsOptions
    });
  }

  /**
   * 注册地图就绪回调函数
   * @param {Function} callback - 回调函数，参数为MapManager实例
   * @returns {MapManager} - 返回实例本身，支持链式调用
   */
  onMapReady(callback) {
    if (typeof callback === 'function') {
      if (this.isLoaded) {
        // 如果地图已加载完成，直接执行回调
        callback(this);
      } else {
        // 否则添加到回调队列
        this.onMapReadyCallbacks.push(callback);
      }
    }
    return this;
  }

  /**
   * 获取地图实例
   * @returns {Object} 高德地图实例
   */
  getMap() {
    return this.map;
  }

  /**
   * 获取绘制工具实例
   * @returns {DrawingTools} 绘制工具实例
   */
  getDrawingTools() {
    return this.drawingTools;
  }

  /**
   * 获取地图工具实例
   * @returns {MapTools} 地图工具实例
   */
  getMapTools() {
    return this.mapTools;
  }

  /**
   * 开始绘制
   * @param {string} mode - 绘制模式：'polyline', 'polygon', 'circle'
   * @returns {MapManager} - 返回实例本身，支持链式调用
   */
  startDrawing(mode) {
    if (this.drawingTools) {
      this.drawingTools.startDrawing(mode);
    }
    return this;
  }

  /**
   * 清除所有绘制
   * @returns {MapManager} - 返回实例本身，支持链式调用
   */
  clearDrawings() {
    if (this.drawingTools) {
      this.drawingTools.clearDrawings();
    }
    return this;
  }

  /**
   * 设置绘制完成回调函数
   * @param {Function} callback - 回调函数，参数为绘制结果对象
   * @returns {MapManager} - 返回实例本身，支持链式调用
   */
  onDrawComplete(callback) {
    if (this.drawingTools) {
      this.drawingTools.setDrawCompleteCallback(callback);
    }
    return this;
  }

  /**
   * 放大地图
   * @param {number} step - 放大步长
   * @returns {MapManager} - 返回实例本身，支持链式调用
   */
  zoomIn(step) {
    if (this.mapTools) {
      this.mapTools.zoomIn(step);
    }
    return this;
  }

  /**
   * 缩小地图
   * @param {number} step - 缩小步长
   * @returns {MapManager} - 返回实例本身，支持链式调用
   */
  zoomOut(step) {
    if (this.mapTools) {
      this.mapTools.zoomOut(step);
    }
    return this;
  }

  /**
   * 顺时针旋转地图
   * @param {number} angle - 旋转角度
   * @returns {MapManager} - 返回实例本身，支持链式调用
   */
  rotateClockwise(angle) {
    if (this.mapTools) {
      this.mapTools.rotateClockwise(angle);
    }
    return this;
  }

  /**
   * 逆时针旋转地图
   * @param {number} angle - 旋转角度
   * @returns {MapManager} - 返回实例本身，支持链式调用
   */
  rotateCounterClockwise(angle) {
    if (this.mapTools) {
      this.mapTools.rotateCounterClockwise(angle);
    }
    return this;
  }

  /**
   * 重置地图角度
   * @returns {MapManager} - 返回实例本身，支持链式调用
   */
  resetMapView() {
    if (this.mapTools) {
      this.mapTools.resetMapView();
    }
    return this;
  }
  
  /**
   * 定位当前位置
   * @returns {Promise} 返回Promise对象，定位成功后解析
   */
  locateCurrentPosition() {
    if (this.mapTools) {
      return this.mapTools.locateCurrentPosition();
    }
    return Promise.reject(new Error('地图工具实例不存在'));
  }

  /**
   * 添加控件
   * @param {string} name - 控件名称
   * @param {Object} control - 控件实例
   * @returns {MapManager} - 返回实例本身，支持链式调用
   */
  addControl(name, control) {
    if (this.map && control) {
      this.map.addControl(control);
      this.controls[name] = control;
    }
    return this;
  }

  /**
   * 获取控件
   * @param {string} name - 控件名称
   * @returns {Object|null} 控件实例或null
   */
  getControl(name) {
    return this.controls[name] || null;
  }

  /**
   * 移除控件
   * @param {string} name - 控件名称
   * @returns {MapManager} - 返回实例本身，支持链式调用
   */
  removeControl(name) {
    const control = this.controls[name];
    if (this.map && control) {
      this.map.removeControl(control);
      delete this.controls[name];
    }
    return this;
  }

  /**
   * 销毁地图管理器
   */
  destroy() {
    // 销毁工具类
    if (this.drawingTools) {
      this.drawingTools.destroy();
      this.drawingTools = null;
    }

    if (this.mapTools) {
      this.mapTools.destroy();
      this.mapTools = null;
    }

    // 销毁地图
    if (this.map) {
      this.map.destroy();
      this.map = null;
    }

    // 清空其他属性
    this.controls = {};
    this.isLoaded = false;
    this.loadPromise = null;
    this.onMapReadyCallbacks = [];
  }
}